/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sunspotworld;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Salaver
 */
public class hiloCosecha extends Thread{
    
    public boolean corriendo = true;
    ConexionBD con = new ConexionBD();
    public int estado = 0;
    
    
    public void cosechando(){
        try {
            if ((HidroponiaHost.cosecha.etapa.getId()==1) && (estado == 1)){
                HidroponiaHost.bienvenido.jLabel5.setText("Proximo riego: Cargando..");
                HidroponiaHost.cosecha.semillero.regar();
                estado = 0;
            } else if ((HidroponiaHost.cosecha.etapa.getId()>1) && (estado == 1)){
                HidroponiaHost.bienvenido.jLabel5.setText("Proximo riego: Cargando..");
                HidroponiaHost.cosecha.mezcla.regar();
                estado = 0;
            }
            while (corriendo){
                System.out.println("cosechando");
                if (HidroponiaHost.cosecha.etapa.getId()==1){
                    revisarEtapa();
                    revisarRiego();
                    
                } else{
                    revisarEtapa();
                    revisarRiego();
                    
                }
            Thread.sleep(1000);
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(hiloCosecha.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void terminarCosecha(){
        this.corriendo = false;
    }
    
    
    public void revisarRiego(){
        try {
            con.conectar();
            Date now = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            if (HidroponiaHost.cosecha.etapa.getId()==1){
                String query1 = "SELECT MAX(hora_inicio) FROM semillero_riego WHERE semillero_id="+HidroponiaHost.cosecha.semillero.getId()+" AND riego_id=1";
                ResultSet rs1 = con.consultar(query1);
                rs1.next();
                if (rs1.getString(1) != null){
                    String inicio = rs1.getString(1);
                    HidroponiaHost.bienvenido.jLabel5.setText("Proximo riego: "+sdf.format(sdf.parse(inicio).getTime()+(HidroponiaHost.minuto*HidroponiaHost.cosecha.etapa.getCiclo())));
                    if (sdf.format(sdf.parse(inicio).getTime()+(HidroponiaHost.minuto*HidroponiaHost.cosecha.etapa.getCiclo())).equals(sdf.format(now))){
                        System.out.println("es hora de regar el semillero");
                        HidroponiaHost.cosecha.semillero.regar();
                    }
                } else{
                    System.out.println("realizando primer reigo");
                    HidroponiaHost.cosecha.semillero.regar();
                }
            } else{
                String query1 = "SELECT MAX(hora_inicio) FROM mezcla_riego WHERE mezcla_id="+HidroponiaHost.cosecha.mezcla.getId()+" AND riego_id=2";
                ResultSet rs1 = con.consultar(query1);
                rs1.next();
                if (rs1.getString(1) != null){
                    String inicio = rs1.getString(1);
                    HidroponiaHost.bienvenido.jLabel5.setText("Proximo riego: "+sdf.format(sdf.parse(inicio).getTime()+(HidroponiaHost.minuto*HidroponiaHost.cosecha.etapa.getCiclo())));
                    if (sdf.format(sdf.parse(inicio).getTime()+(HidroponiaHost.minuto*HidroponiaHost.cosecha.etapa.getCiclo())).equals(sdf.format(now))){
                        System.out.println("es hora de regar la mezcla");
                        HidroponiaHost.cosecha.mezcla.regar();
                    }
                } else{
                    System.out.println("primer riego mezcla");
                    HidroponiaHost.cosecha.mezcla.regar();
                }
            }
            con.desconectar();
        } catch (SQLException ex) {
            Logger.getLogger(Cosecha.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(Cosecha.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
       
       public void revisarEtapa(){
        try {
            con.conectar();
            Date now = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            String query1 = "SELECT fecha_inicio FROM etapa_cosecha WHERE cosecha_id="+HidroponiaHost.cosecha.getId()+" AND etapa_id="+HidroponiaHost.cosecha.etapa.getId();
            ResultSet rs1 = con.consultar(query1);
            rs1.next();
            Calendar cambio = Calendar.getInstance();
            cambio.setTime(sdf.parse(rs1.getString(1)));
            cambio.add(Calendar.DATE, HidroponiaHost.cosecha.etapa.getFase()); 
            Calendar ahora = Calendar.getInstance();
            ahora.setTime(now);
            System.out.println("cambio de fase "+sdf.format(cambio.getTime()));
            System.out.println("mayor que ahora "+sdf.format(now.getTime()));
            if ((cambio.compareTo(ahora) == 0) || (cambio.compareTo(ahora) < 0 )){
                //cambiar etapa
                String query2 = "UPDATE etapa_cosecha SET fecha_fin='"+sdf.format(now)+"' WHERE cosecha_id="+HidroponiaHost.cosecha.getId()+" AND etapa_id="+HidroponiaHost.cosecha.etapa.getId();
                con.insertar(query2);
                if (HidroponiaHost.cosecha.etapa.getId() < 4){
                    HidroponiaHost.hiloS.transmitir(3, 3, 1);
                    JOptionPane.showMessageDialog(HidroponiaHost.bienvenido,
                    "La etapa "+HidroponiaHost.cosecha.etapa.getNombre()+ " ha finalizado, cambiando etapa. \n*VACIANDO PISCINA \n*Presione OK para preparar los componentes");
                    HidroponiaHost.hiloS.transmitir(3, 3, 0);
                    JOptionPane.showMessageDialog(HidroponiaHost.bienvenido,
                    "Piscina vaciada. \n*Prepare los componentes de la mezcla \n*Presione OK cuando este listo");
                    if (HidroponiaHost.cosecha.etapa.getId() == 1){
                        HidroponiaHost.cosecha.mezcla = new Mezcla();
                        String query5 = "INSERT INTO mezcla VALUES(null,"+HidroponiaHost.cosecha.getId()+")";
                        con.insertar(query5);
                        String query6 = "SELECT MAX(id) FROM mezcla";
                        ResultSet rs6 = con.consultar(query6);
                        rs6.next();
                        HidroponiaHost.cosecha.mezcla.setId(rs6.getInt(1));
                        HidroponiaHost.cosecha.mezcla.cargarNutrientes();
                        HidroponiaHost.cosecha.mezcla.cargarRangos();
                        HidroponiaHost.hiloS.start();
                        HidroponiaHost.hiloE.start();
                    }
                    String query3 = "SELECT id, nombre, duracion, ciclo, fase FROM etapa WHERE id="+(HidroponiaHost.cosecha.etapa.getId()+1);
                    ResultSet rs3 = con.consultar(query3);
                    rs3.next();
                    HidroponiaHost.cosecha.etapa.setId(rs3.getInt(1));
                    HidroponiaHost.cosecha.etapa.setNombre(rs3.getString(2));
                    HidroponiaHost.cosecha.etapa.setDuracion(rs3.getInt(3));
                    HidroponiaHost.cosecha.etapa.setCiclo(rs3.getInt(4));
                    HidroponiaHost.cosecha.etapa.setFase(rs3.getInt(5));
                    System.out.println("se ha cambiado a la etapa "+HidroponiaHost.cosecha.etapa.getNombre());
                    String query4 = "INSERT INTO etapa_cosecha VALUES("+rs3.getInt(1)+","+HidroponiaHost.cosecha.getId()+",'"+sdf.format(now)+"',null)";
                    con.insertar(query4);
                    HidroponiaHost.bienvenido.jTextArea2.setText("Cosecha: "+HidroponiaHost.cosecha.getNombre()+"\nCantida de Lechugas: "+HidroponiaHost.cosecha.getCantidad()+"\nEtapa actual: "+HidroponiaHost.cosecha.etapa.getNombre());

                } else{
                    String query5 = "UPDATE etapa_cosecha SET fecha_fin="+sdf.format(now)+" WHERE cosecha_id="+HidroponiaHost.cosecha.getId()+" AND etapa_id="+HidroponiaHost.cosecha.etapa.getId();
                    con.insertar(query5);
                    HidroponiaHost.estado = 0;
                    HidroponiaHost.cosecha = new Cosecha();
                    HidroponiaHost.cosecha.setId(0);
                    HidroponiaHost.hiloC.terminarCosecha();
                    HidroponiaHost.hiloS.terminarCosecha();
                                HidroponiaHost.hiloE.terminarCosecha();
                    HidroponiaHost.bienvenido.regandoLabel.setText("Proximo riego:");
                    HidroponiaHost.bienvenido.jTextArea1.setText("");
                    HidroponiaHost.bienvenido.jTextArea2.setText("");
                    HidroponiaHost.dialesT.setValor(15);
                    HidroponiaHost.dialesPH.setValor(3);
                    HidroponiaHost.dialesA.setValor(0);
                    HidroponiaHost.diales1.setValor(0);
                    HidroponiaHost.diales2.setValor(0);
                    HidroponiaHost.diales3.setValor(0);
                    HidroponiaHost.diales4.setValor(0);
                    Object[] options = {"Si, crear",
                    "No, cerrar sistema"};
                    int n = JOptionPane.showOptionDialog(HidroponiaHost.bienvenido,
                    "La cosecha ha terminado! \nDesea iniciar una nueva o salir del sistema?",
                    "Aviso",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null,     //do not use a custom Icon
                    options,  //the titles of buttons
                    options[0]); //default button title
                    if (n == 0){
                        if (HidroponiaHost.usuario.getCargo().equals("Administrador")){
                            CosechaDialog cosechad = new CosechaDialog(null);
                            cosechad.setVisible(true);
                            //default title and icon
                            JOptionPane.showMessageDialog(HidroponiaHost.bienvenido,
                            "Creando nueva cosecha. \n*Recuerde preparar las componentes del sistema \n*Presione OK cuando este listo");
                            HidroponiaHost.hiloC = new hiloCosecha();
                            HidroponiaHost.hiloS = new HiloSensoresExternos();
                                HidroponiaHost.hiloE = new HiloSensoresInternos();
                            HidroponiaHost.hiloC.estado = 1;
                            HidroponiaHost.hiloC.run();
                        } else{
                            JOptionPane.showMessageDialog(HidroponiaHost.bienvenido,
                            "Debe cerrar sesion e iniciar como Administrador para iniciar la proxima cosecha!");
                        }
                    } else{
                        //default title and icon
                        JOptionPane.showMessageDialog(HidroponiaHost.bienvenido,
                        "Gracias por usar Hidroponia Smart!, hasta pronto..");
                        System.exit(0);
                    }
                }     
            }
            con.desconectar();
        } catch (SQLException ex) {
            Logger.getLogger(Etapa.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
                Logger.getLogger(Etapa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
    public void run(){
        try {
            Thread.sleep(5000);
            cosechando();
        } catch (InterruptedException ex) {
            Logger.getLogger(hiloCosecha.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}
